//请求报文
var requestmsg = "";
// 参数键值对
var parapair = [];
/**
 * URL参数
 * 
 * @param original
 * @param name
 * @param value
 */
function urlParameter(original, name, value) {
	// 匹配模式：name=*
	var re = new RegExp(name + "\s*=", "i");
	var substr = original.match(re);
	// 没有找到匹配项，返回
	if (substr == null) {
		return null;
	}
	// 截取匹配结果子段
	var sublv1 = substr[0];
	var startIndex=original.indexOf(sublv1);
	var sublv2=original.substring(startIndex+sublv1.length);
	var indexofSep=sublv2.indexOf('&');
	if(indexofSep<0){
		return original.substring(0,startIndex+sublv1.length)+value;
	}
	return original.substring(0,startIndex+sublv1.length)+value+original.substring(startIndex+sublv1.length+indexofSep);
}
/**
 * 默认参数
 * 
 * @param name：参数名
 * @param value：参数值
 */
function defaultParameter(name, value) {
	var exist = false;
	// 遍历参数键值对列表，找到目标键，并赋新值
	$.each(parapair, function(index, item) {
		if (item.name == name) {
			parapair[index].value = value;
			exist = true;
		}
	});
	// 该键未赋过值，将其加入键值对列表中
	if (exist == false) {
		parapair[parapair.length] = {
			name : name,
			value : value
		};
	}
	// 打印键值对
	return printParaPair(parapair);
}
/**
 * 自定义参数值替换
 * 
 * @param name
 * @param value
 */
function selfDefineParameter(name, value) {
	// 匹配SOAP报文参数
	var result = matchSoapParam(name, value);
	if (result != null) {
		requestmsg = result;
		return result;
	}
	// 匹配JSON报文参数,值以双引号标识
	result = matchJsonParam4DoubleQuote(name, value);
	if (result != null) {
		requestmsg = result;
		return result;
	}
	// 匹配JSON报文参数,值以大括号标识
	result = matchJsonParam4Braces(name, value);
	if (result != null) {
		requestmsg = result;
		return result;
	}
	// 匹配其它类型参数

	return result;
}

/**
 * 匹配SOAP报文参数
 */
function matchSoapParam(name, value) {
	// 匹配模式：<namespace:name>XXX</namespace:name>
	var substr = requestmsg.match("<(((?!:).)*:)?\\s*" + name
			+ "\\s*>.*</(((?!:).)*:)?\\s*" + name + "\\s*>");
	// 没有找到匹配项，返回
	if (substr == null) {
		return null;
	}
	// 截取匹配结果子段
	var sublv1 = substr[0];
	// 用新值替换结果子段中的旧值
	var substr2 = sublv1.replace(/>.*</, ">" + value + "<");
	if (substr2 == null) {
		return null;
	}
	// 用新子段替换旧子段
	return requestmsg.replace(sublv1, substr2);
}

/**
 * 匹配JSON报文参数,值以双引号标识
 */
function matchJsonParam4DoubleQuote(name, value) {
	// 匹配模式："name":"value",不区分大小写
	var re = new RegExp("\"\\s*" + name
			+ "\\s*\"\\s*:\\s*\"(((?!\").)*)?\\s*\"", "mi");
	var substr = requestmsg.match(re);
	if (substr == null) {
		return null;
	}
	// 截取字符串："name":"value"
	var sublv1 = substr[0];
	// sublv1 = sublv1[0];//.substring(0, sublv1.lastIndexOf('"') + 1);
	var substr2 = "";
	// 获取原始的name（按原来的name的大小写赋值）
	var originalName = sublv1.substring(sublv1.indexOf('"') + 1);
	originalName = originalName.substring(0, originalName.indexOf('"'));
	// 组装目标值
	substr2 = '"' + originalName + '":"' + value + '"';
	if (substr2 == null) {
		return null;
	}
	// 替换目标值
	return requestmsg.replace(sublv1, substr2);
}

/**
 * 匹配JSON报文参数,值以大括号标识
 */
function matchJsonParam4Braces(name, value) {
	// 匹配模式："name":,不区分大小写
	var re = new RegExp("\"\\s*" + name + "\\s*\"\\s*:", "i");
	var substr = requestmsg.match(re);
	if (substr == null) {
		return null;
	}
	// 截取字符串："name"
	var sublv1 = substr[0];
	var index = requestmsg.indexOf(sublv1);
	// 取"{....}"模式最外层"{}"的"{"的下标
	var firstLeftBracesIndex = requestmsg.indexOf('{', index);
	if (firstLeftBracesIndex < 0) {
		return null;
	}
	// 取"{....}"模式最外层"{}"的"}"的下标
	var lastRightBracesIndex = searchLastRightMatchBraces(requestmsg,
			firstLeftBracesIndex);
	if (lastRightBracesIndex < 0) {
		return null;
	}
	// 获取原始的name（按原来的name的大小写赋值）
	var originalName = sublv1.substring(sublv1.indexOf('"') + 1);
	originalName = originalName.substring(0, originalName.indexOf('"'));
	// 组装目标值
	var substr2 = '"' + originalName + '":{' + value + '}';
	// 替换目标值
	return requestmsg.replace(requestmsg.substring(index,
			lastRightBracesIndex + 1), substr2);
}

function searchLastRightMatchBraces(requestmsg, startIndex) {
	var length = requestmsg.length;
	var num = 0;
	// 最外层"{....}"的"}"的位置
	var targetIndex = 0;
	for (var i = startIndex; i < length; ++i) {
		if (requestmsg[i] != '{' && requestmsg[i] != '}') {
			continue;
		}
		// 左括号加1
		if (requestmsg[i] == '{') {
			num++;
		}
		// 右括号加1
		if (requestmsg[i] == '}') {
			num--;
		}
		// 左括号数=右括号数，证明找到模式"{....}"的最外层的"}"的位置
		if (num == 0) {
			targetIndex = i;
			break;
		}
	}
	return targetIndex;
}

/**
 * 打印键值对为JSON字符串
 */
function printParaPair(parapair) {
	if (parapair == null || parapair == '' || parapair.lenght == 0) {
		return null;
	}
	// 组装报文
	var content = "{";
	// 遍历键值对列表，将键值对组装JSON字符串
	$.each(parapair, function(index, item) {
		content += (index == 0 ? '' : ',') + '"' + parapair[index].name + '":"'
				+ parapair[index].value + '"';
	});
	content += "}";
	return content;
}
